package br.urca.controller.webservice;

import java.util.ArrayList;
import java.util.List;

import javax.inject.Inject;
import javax.servlet.http.HttpServletRequest;

import br.com.caelum.vraptor.Consumes;
import br.com.caelum.vraptor.Controller;
import br.com.caelum.vraptor.Post;
import br.com.caelum.vraptor.Put;
import br.com.caelum.vraptor.Result;
import br.com.caelum.vraptor.view.Results;
import br.urca.dao.AlunoDAO;
import br.urca.dao.AlunosCursoDAO;
import br.urca.model.AlunoCurso;
import br.urca.model.json.AlunoMobile;
import br.urca.util.CryptDoc;
import br.urca.util.Utils;
import br.urca.util.ValidacaoDados;

@Controller
public class WSAlunosController {

	private AlunosCursoDAO mDAO;
	private AlunoDAO mAlunoDAO;
	private Result result;
	private HttpServletRequest request;
	
	public WSAlunosController() { }
	
	@Inject
	public WSAlunosController(AlunosCursoDAO mDAO, AlunoDAO mAlunoDAO,
			Result result, HttpServletRequest request) {
		this.mDAO = mDAO;
		this.mAlunoDAO = mAlunoDAO;
		this.result = result;
		this.request = request;
	}
	
	public List<AlunoCurso> lista() {
		return this.mDAO.todos();
	}
	
	@Put("/" + Utils.PATH_ATUALIZACAO_ALUNOS)
	@Consumes("application/json")
	public void atualizarDadosAluno(AlunoMobile aluno) {
		
		String arg0 = request.getHeader("Authorization");
		System.out.println(arg0);
		
		try {
			if (request.getHeader("Authorization") != null && aluno != null) {
				
			
				String autorizacao = request.getHeader("Authorization");
				
				if (autorizacao.equals(CryptDoc.getB64Auth(aluno.getMatricula(), aluno.getSenha()))) {
		
					AlunoCurso alunoCurso = mDAO.buscaPorId(aluno.getId());
					if (alunoCurso != null) {
						alunoCurso.getAluno().setBairro(aluno.getBairro());			
						alunoCurso.getAluno().setEndereco(aluno.getEndereco());
						alunoCurso.getAluno().setCidade(aluno.getCidade());
						alunoCurso.getAluno().setCep(aluno.getCep());
						alunoCurso.getAluno().setCpf(aluno.getCpf());
						alunoCurso.getAluno().setRg(aluno.getRg());
						alunoCurso.getAluno().setOrgaoExpeditor(aluno.getOrgaoExpeditor());
						alunoCurso.getAluno().setUfIdentidade(aluno.getUfIdentidade());
						mAlunoDAO.salvar(alunoCurso.getAluno());
					}
					this.result.use(Results.json()).from(aluno, "resposta").serialize();
				} else {
					throw new Exception();
				} 
			} else {
				throw new Exception();
			}
		} catch(Exception e) {
			this.result.use(Results.json()).from(new ArrayList<>(), "resposta").serialize();
		}
	}
	
	@Post("/"+Utils.PATH_CONSULTA_MATRICULA)
	public void consultaMatriculaSenha() {
		try {
			if (request.getParameter("arg0") != null && request.getParameter("arg1") != null && request.getHeader("Authorization") != null) {
				
				String cpf = request.getParameter("arg0");
				cpf = CryptDoc.decrypt(CryptDoc.KEY, cpf);
		
				String rg = request.getParameter("arg1");
				rg = CryptDoc.decrypt(CryptDoc.KEY, rg);
		
				String autorizacao = request.getHeader("Authorization");
				
				if (autorizacao.equals(CryptDoc.getB64Auth(cpf, rg))) {
					
					if (ValidacaoDados.senhaValida(rg) && ValidacaoDados.caracterCPFValido(cpf)) {
						
						List<AlunoCurso> mList = this.mDAO.buscaMatriculaSenha(cpf, rg);

						if (mList != null && !mList.isEmpty()) {
							
							AlunoCurso mAlunoCurso = mList.get(mList.size() -1);
							
							this.result.use(Results.json()).from(mAlunoCurso, "consulta")
									.include("aluno").include("curso")
									.include("situacao").serialize();
						} else {
							throw new Exception();
						}
					} else {
						throw new Exception();
					}
				} else {
					throw new Exception();
				}
			} else {
				throw new Exception();
			}
		} catch(Exception e) {
			this.result.use(Results.json()).from(new ArrayList<>(), "consulta").serialize();
		}		
	}
	
	@Post("/"+Utils.PATH_LOGIN_MOBILE)
	public void login() {
		try {
			if (request.getParameter("arg0") != null && request.getParameter("arg1") != null && request.getHeader("Authorization") != null) {
				
				String matricula = request.getParameter("arg0");
				matricula = CryptDoc.decrypt(CryptDoc.KEY, matricula);
		
				String senha = request.getParameter("arg1");
				senha = CryptDoc.decrypt(CryptDoc.KEY, senha);
		
				String autorizacao = request.getHeader("Authorization");
				
				if (autorizacao.equals(CryptDoc.getB64Auth(matricula, senha))) {
					
					if (ValidacaoDados.loginValido(matricula) && ValidacaoDados.senhaValida(senha)) {
						
						AlunoCurso mAlunoCurso = this.mDAO.buscaDadosAluno(matricula, senha);
						
						if (mAlunoCurso != null) {
							
							this.result.use(Results.json()).from(mAlunoCurso, "consulta")
									.include("aluno").include("curso")
									.include("situacao").serialize();
						} else {
							throw new Exception();
						}
					} else {
						throw new Exception();
					}
				} else {
					throw new Exception();
				}
			} else {
				throw new Exception();
			}
		} catch(Exception e) {
			this.result.use(Results.json()).from(new ArrayList<>(), "consulta").serialize();
		}
	}
	
}
